package ongd.negocio.gestion;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import ongd.negocio.sesion.ControladorSesion;
import ongd.servicios.persistencia.ControladorPersistencia;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;

/**
 * Clase que realizará las operaciones necesarias para gestionar
 * los voluntarios.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 */
public class ControladorVoluntario {

    /**
     * Objeto del tipo controlador persistencia que nos servirá para trabajar con 
     * las diferentes entidades.
     */
    private ControladorPersistencia contP;
    /**
     * Objeto del tipo controlador sesion que nos servirá para saber 
     * en que sesion estamos.
     */
    private ControladorSesion contSesion;

    /**
     * Constructor de la clase.
     * @param contP controlador Persistencia
     * @param contSesion sesión en la que estamos
     */
    public ControladorVoluntario(ControladorPersistencia contP, ControladorSesion contSesion) {
        this.contP = contP;
        this.contSesion = contSesion;
    }

    /**
     * Método que crea un voluntario.
     * @param persona Voluntario que crearemos en la base de datos
     * @return true o false en funcion de si el voluntario se ha creado
     * @throws PreexistingEntityException
     * @throws Exception 
     */
    public boolean crearVoluntario(Persona persona) throws PreexistingEntityException, Exception {
        if (persona.getDni() != null && persona.getNombre() != null && persona.getApellidos() != null) {
            if (persona.esVoluntario()) {
                persona.setFechaRegistro(new Date());
                persona.setActivo(Boolean.TRUE);
                contP.crearEntidad(persona);
                return true;
            }
            return true;
        }
        return false;
    }

    /**
     * Método que obtiene todos los voluntarios de la base de datos.
     * @return lista de voluntarios
     */
    public List<Persona> obtenerVoluntarios() {
        List<Persona> voluntarios = new ArrayList<Persona>();
        for (Persona persona : (List<Persona>) contP.obtenerEntidades(Persona.class)) {
            if (persona.esVoluntario()) {
                voluntarios.add(persona);
            }
        }
        return voluntarios;
    }

    /**
     * Método que obtiene todos los voluntarios de la base de datos activos.
     * @return lista de voluntarios
     */
    public List<Persona> obtenerVoluntariosActivos() {
        List<Persona> voluntariosActivos = new ArrayList<Persona>();
        for (Persona voluntario : obtenerVoluntarios()) {
            if (voluntario.getActivo()) {
                voluntariosActivos.add(voluntario);
            }
        }
        return voluntariosActivos;
    }

    /**
     * Método que obtiene todos los voluntarios de la base de datos desactivos.
     * @return lista de voluntarios desactivados.
     */
    public List<Persona> obtenerVoluntariosDesactivados() {
        List<Persona> voluntariosDesactivados = new ArrayList<Persona>();
        for (Persona voluntario : obtenerVoluntarios()) {
            if (!voluntario.getActivo()) {
                voluntariosDesactivados.add(voluntario);
            }
        }
        return voluntariosDesactivados;
    }

    /**
     * Método que edita un voluntario.
     * @param voluntario Voluntario que vamos a editar
     * @return true o false en función de si se ha realizado correctamente
     * @throws IllegalOrphanException
     * @throws NonexistentEntityException
     * @throws Exception 
     */
    public boolean editarVoluntario(Persona voluntario) throws IllegalOrphanException, NonexistentEntityException, Exception {
        if (voluntario.getDni() != null && voluntario.getNombre() != null && voluntario.getApellidos() != null) {
            contP.editarEntidad(voluntario);
            return true;
        }
        return false;
    }

    /**
     * Método que borra un voluntario de la base de datos.
     * @param voluntario Voluntario que borraremos de la base de datos
     * @return true o false en funcion de si el voluntario se ha borrado
     * @throws IllegalOrphanException
     * @throws NonexistentEntityException 
     */
    public boolean borrarVoluntario(Persona voluntario) throws IllegalOrphanException, NonexistentEntityException {

        contP.destroyEntidad(Persona.class, voluntario.getDni());
        return true;
    }

   /**
     * Metodo que activa un voluntario.
     * @param voluntario Voluntario 
     * @return true si la operación se realiza correctamente
     * @throws IllegalOrphanException
     * @throws NonexistentEntityException
     * @throws Exception 
     */
    public boolean activarVoluntario(Persona voluntario) throws IllegalOrphanException, NonexistentEntityException, Exception {
        if (!voluntario.getActivo()) {
            voluntario.setActivo(Boolean.TRUE);
            editarVoluntario(voluntario);
            return true;
        }
        return false;
    }

    /**
     * Método que desactiva un voluntario.
     * @param voluntario Voluntario
     * @return true si la operación se realiza correctamente
     * @throws IllegalOrphanException
     * @throws NonexistentEntityException
     * @throws Exception 
     */
    public boolean desactivarVoluntario(Persona voluntario) throws IllegalOrphanException, NonexistentEntityException, Exception {
        if (voluntario.getActivo()) {
            voluntario.setActivo(Boolean.FALSE);
            editarVoluntario(voluntario);
            return true;
        }
        return false;
    }

    /**
     * Método que devuelve un objeto del tipo ControladorPersistencia.
     * @return contP
     * @see #setContP
     */
    public ControladorPersistencia getContP() {
        return contP;
    }

    /**
     * Método que establece un objeto del tipo ControladorPersistencia.
     * @param contP Nuevo valor de la variable
     * @see #getContP
     */
    public void setContP(ControladorPersistencia contP) {
        this.contP = contP;
    }

    /**
     * Método que devuelve un objeto del tipo ControladorSesion.
     * @return contSesion
     * @see #setContSesion
     */
    public ControladorSesion getContSesion() {
        return contSesion;
    }

    /**
     * Método que establece un objeto del tipo ControladorSesion.
     * @param contSesion Nuevo valor de la variable
     * @see #getContSesion
     */
    public void setContSesion(ControladorSesion contSesion) {
        this.contSesion = contSesion;
    }
}